// 函数练习
// 1. 定义一个无参数无返回值的函数，打印"Hello, Function!"
// 2. 定义一个接收两个i32参数并返回它们之和的函数
// 3. 定义一个函数，接收一个i32参数，返回其是否为偶数的布尔值
// 4. 使用函数表达式（闭包）存储一个计算平方的函数
// 5. 定义一个递归函数，计算斐波那契数列的第n项
// 6. 尝试在函数内部修改外部变量（需要使用mut和闭包）

/* 以下是用户之前的代码（已注释）
fn main() {
    println!("这是一个函数练习文件。");
    println!("请根据注释提示，完成相应的练习任务。");
    print_func();
    add(1, 2);
    is_bool();
}

fn print_func() {
    println!("Hello, Function!")
}

fn add(a: i32, b: i32) {
    return a + b;
}

fn is_bool(n: i32) {
    if (n % 2 == 0) {
        return true;
    } else {
        return false;
    }
}
*/

// 1. 无参数无返回值的函数
fn print_greeting() {
    println!("Hello, Function!");
}

// 2. 接收两个i32参数并返回它们之和的函数
fn add(a: i32, b: i32) -> i32 {
    a + b
}

// 3. 接收一个i32参数，返回其是否为偶数的布尔值
fn is_even(n: i32) -> bool {
    n % 2 == 0
}

// 4. 使用闭包存储一个计算平方的函数
fn square_demo() {
    let square = |x: i32| x * x;
    println!("5的平方是: {}", square(5));
}

// 5. 递归函数，计算斐波那契数列的第n项
fn fibonacci(n: u32) -> u32 {
    if n <= 1 {
        return n;
    }
    fibonacci(n - 1) + fibonacci(n - 2)
}

// 6. 在函数内部修改外部变量（使用mut和闭包）
fn modify_external_var() {
    let mut count = 0;
    let mut increment = || {
        count += 1;
        println!("当前计数: {}", count);
    };

    increment();
    increment();
    increment();
}

// 主函数
fn main() {
    println!("这是一个函数练习文件。");
    println!("以下是各个练习的实现:");

    // 调用练习1的函数
    println!("\n练习1 - 无参数无返回值函数:");
    print_greeting();

    // 调用练习2的函数
    println!("\n练习2 - 两数求和函数:");
    let sum = add(5, 3);
    println!("5 + 3 = {}", sum);

    // 调用练习3的函数
    println!("\n练习3 - 偶数判断函数:");
    println!("10是偶数: {}", is_even(10));
    println!("7是偶数: {}", is_even(7));

    // 调用练习4的函数
    println!("\n练习4 - 闭包平方计算:");
    square_demo();

    // 调用练习5的函数
    println!("\n练习5 - 斐波那契递归函数:");
    println!("斐波那契数列第10项: {}", fibonacci(10));

    // 调用练习6的函数
    println!("\n练习6 - 闭包修改外部变量:");
    modify_external_var();
}
